package com.standardoperationapp.net;


import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
public interface HttpApi {
    //登录

    @GET ("code")
    Observable<ResponseBody> getCAPTCHA();
    @POST("auth/login")
    Observable<ResponseBody> getLogin(@Body Map<String, String> map);
    @GET ("device/app/dev/lock-open/list") //获取当前开锁列表
    Observable<ResponseBody> getLockOpenList();
    @GET("device/app/dev/lock-open/checkLockEmpower/{id}")
    Observable<ResponseBody> checkLockEmpower(@Path("id")String id);

    @GET ("device/app/dev/lock-open/getMyAccessDoor/list")//获取当前部门下的通道门信息
    Observable<ResponseBody> getMyAccessDoor();

    @GET("device/app/dev/lock-open/chekUnlockNum/{lockId}")//紧急开锁码
    Observable<ResponseBody> chekUnlockNum(@Path("lockId")String id, @Query("randomNumber") String randomNumber );
    @POST("device/app/dev/lock-open/add/empower/lockOpen/{id}")
    Observable<ResponseBody> getLockOpen(@Path("id")String id,@Body HashMap<String, String> map);

    @POST("device/app/dev/lock-open/add/emergent/lockOpen/{token}")
    Observable<ResponseBody> getEmergentLockOpen(@Path("token")String token,@Body HashMap<String,String>hashMap);
    @POST("device/app/dev/lock-open/add") //获取开门钥匙
    Observable<ResponseBody> getLockOpenKey(@Body HashMap<String, String> map);
    @GET("system/user/drop/list")
    Observable<ResponseBody> getDropList();
    @GET("device/app/dev/lock-open/bluetoothLock")
    Observable<ResponseBody> getBluetoothLock(@Query("mac")String mac,@Query("status")String status,@Query("remark")String remark,@Query("battery")String battery);



    // region 报废
    // 获取批次列表 0-入库 1-出库
    @GET("material/matScrapDetails/batchNumList")
    Observable<ResponseBody> getScrapBatchNumList(@Query("returnApp") int returnApp);
    // 根据id查询报废数据列表
    @GET("material/matScrapDetails/findList")
    Observable<ResponseBody> scrapFindList(@Query("id") String id);
    //报废-保存
    @POST("material/matScrapDetails/updateList")
    Observable<ResponseBody> saveScrap(@Body Map<String, Object> map);
    //报废-提交
    @POST("material/matScrapDetails/submitList")
    Observable<ResponseBody> submitScrap(@Body Map<String, Object> map);
    // endregion

    //region 库存补充
    //库存补充-过滤所有计划号
    @GET("material/matPurchaseDetails/getPlanMark")
    Observable<ResponseBody> getPurchasePlanMark();
    //库存补充-根据批号和名称查询采购计划以及采购详情
    @GET("material/matPurchaseDetails/getPurchaseApp")
    Observable<ResponseBody> getPurchaseApp(@Query("planMark") String planMark, @Query("planName") String planName);
    //库存补充-点击编辑或查看得到对应信息
    @GET("material/matPurchaseDetails/getPurchaseDetailsApp")
    Observable<ResponseBody> getPurchaseDetailsApp(@Query("id") int id);
    //库存补充-保存
    @POST("material/matPurchaseDetails/savePurchaseDetailsApp")
    Observable<ResponseBody> savePurchaseDetailsApp(@Body Map<String, Object> map);
    //库存补充-提交
    @POST("material/matPurchaseDetails/submitPurchaseDetailsApp")
    Observable<ResponseBody> submitPurchaseDetailsApp(@Body Map<String, Object> map);
    //endregion

    // 入库领用-过滤出所有批号
    @GET("material/matRepertory/detail/inbound/batchNumList")
    Observable<ResponseBody> getInboundBatchNumList();
    // region 出库-领用管理
    // 过滤出所有批号
    @GET("material/matRepertory/detail/batchNumList")
    Observable<ResponseBody> getMatRepertoryBatchNumList();
    //领用管理列表
    @GET("material/matRepertory/detail/findList")
    Observable<ResponseBody> getMatRepertoryList(@Query("batchNum") String batchNum, @Query("storageName") String storageName);
    //领用管理信息
    @GET("material/matRepertory/detail/getById/{id}")
    Observable<ResponseBody> getMatRepertoryById(@Path("id") int id);
    //领用管理-保存
    @POST("material/matRepertory/detail/updateList")
    Observable<ResponseBody> saveMatRepertory(@Body Map<String, Object> map);
    //领用管理-提交
    @POST("material/matRepertory/detail/submitList")
    Observable<ResponseBody> submitMatRepertory(@Body Map<String, Object> map);


    // endregion 领用管理

    //region 调拨管理
    //批号列表
    @GET("material/matCanniba/detail/batchNumList")
    Observable<ResponseBody> getMatCannibaBatchNumList(@Query("returnApp") int returnApp);
    //调拨管理列表
    @GET("material/matCanniba/detail/findList")
    Observable<ResponseBody> getMatCanniba(@Query("batchNum") String batchNum, @Query("storageName") String storageName);
    //调拨详情
    @GET("material/matCanniba/detail/getById/{id}")
    Observable<ResponseBody> getMatCannibaById(@Path("id") int id);
    //调拨管理-保存
    @POST("material/matCanniba/detail/updateList")
    Observable<ResponseBody> saveMatCanniba(@Body Map<String, Object> map);
    //调拨管理-提交
    @POST("material/matCanniba/detail/submitList")
    Observable<ResponseBody> submitMatCanniba(@Body Map<String, Object> map);
    // endregion

    // region todo 盘点管理
    //根据盘点类型查询盘点计划
    @GET("material/matInventoryType/listAll")
    Observable<ResponseBody> getMatInventoryType();
    //根据盘点类型查询盘点计划
    @GET("material/matInventoryTask/listApp")
    Observable<ResponseBody> getMatInventoryTaskList(@Query("inventTypeId") int inventTypeId,
                                                     @Query("pageNum") int pageNum,
                                                     @Query("pageSize") int pageSize);
    //(库存物资)根据盘点id查询盘点详情列表
    @GET("material/matInventoryTaskStock/list")
    Observable<ResponseBody> getMatInventoryTaskStockList(@Query("id") int id);
    //(库存物资)根据盘点详情id查询盘点详情
    @GET("material/matInventoryTaskStock/getInfo/{id}")
    Observable<ResponseBody> getMatInventoryTaskStockById(@Path("id") int id);
    //库存物资-保存
    @POST("material/matInventoryTaskStock/saveList")
    Observable<ResponseBody> saveMatInventoryTaskStock(@Body List map);
    //库存物资-提交
    @POST("material/matInventoryTaskStock/submitList")
    Observable<ResponseBody> submitMatInventoryTaskStock(@Body List map);
    // endregion

    // region todo 现场物资管理
    //(现场物资)根据盘点id查询盘点详情列表
    @GET("material/matInventoryTaskOnsite/list")
    Observable<ResponseBody> getMatInventoryTaskOnsiteList(@Query("id") int id);
    //(现场物资)根据盘点详情id查询盘点详情
    @GET("material/matInventoryTaskOnsite/getInfo/{id}")
    Observable<ResponseBody> getMatInventoryTaskOnsiteById(@Path("id") int id);
    //现场物资-保存
    @POST("material/matInventoryTaskOnsite/saveList")
    Observable<ResponseBody> saveMatInventoryTaskOnsite(@Body List map);
    //现场物资-提交
    @POST("material/matInventoryTaskOnsite/submitList")
    Observable<ResponseBody> submitMatInventoryTaskOnsite(@Body List map);
    // endregion

    //region 出库-消耗
    // 批次号列表
    @GET("material/matConsumerRecord/getBatchNumList")
    Observable<ResponseBody> getMatConsumerBatchNumList();
    //消耗管理明细-App通过主表id查询
    @GET("material/matConsumerDetail/{recordId}")
    Observable<ResponseBody> getMatConsumerDetailById(@Path("recordId") int recordId);
    //现场物资-保存
    @POST("material/matConsumerRecord/saveApp")
    Observable<ResponseBody> saveMatConsumerRecord(@Body Map<String, Object> map);
    //现场物资-提交
    @POST("material/matConsumerRecord/submitApp")
    Observable<ResponseBody> submitMatConsumerRecord(@Body Map<String, Object> map);

    @Multipart
    @POST("file/upload")
    Observable<ResponseBody> uploadFile(@Part MultipartBody.Part file);
    //endregion

    //region RFID写卡

    //APP端获取全部已生成RFID的库存信息
    @GET("material/matRepertory/getAppRfidCodeList")
    Observable<ResponseBody> getAppRfidCodeList();
    //APP端通过RFID获取库存信息
    @GET("material/matRepertory/getAppRfidCodeId")
    Observable<ResponseBody> getMatInfoByRfid(@Path("rfidCode") String rfidCode);
    //APP端更新RFID写入设备状态
    @POST("material/matRepertory/updateAppRfidCodeStatus")
    Observable<ResponseBody> updateAppRfidCodeStatus(@Query("rfidCode") String rfidCode,
                                                     @Query("rfidStatus") String rfidStatus);
    //endregion

    // region作业计划
    //根据当前userid查询作业计划
    @GET("plan/PlanAppWork/SelectWorkPlanListByid")
    Observable<ResponseBody> selectWorkPlanListByid(@Query("userId") int userId);
    // 根据当前作业计划id查询卡控点列表
    @GET("plan/PlanAppWork/SelectCardCrontrollerPointListByid")
    Observable<ResponseBody> selectCardPointListById(@Query("planId") int planId );
                                                     //@Query("roleId") int roleId );

    //  查看卡控点执行操作流程，并判断是否有前序返回完成情况
    //  接口说明：查询当前卡控点操作流程，并校验是否完成前序
    //          查看当前卡控点是否有前序要完成，如果有前序工作未完成，查看需要完成几个，是都需要完成还是只完成一个就行
    //          返回的是当前卡控点所有执行方法，如果没有或者该点的前序未完成则报错
    @GET("plan/PlanAppWork/SelectPointOperateByPointId")
    Observable<ResponseBody> selectPointOperateByPointId(@Query("PointId") int PointId,
                                                         @Query("planId") int planId,
                                                         @Query("implementId") int implementId);
    //查看当前这个用户今天是否需要被提醒，传递进来userid，返回的是今天所有需要提醒的时间
    @GET("plan/PlanAppWork/queryReminderTime")
    Observable<ResponseBody> queryReminderTime(@Query("userId") int userId);
    //酒精、人脸检测查询接口
    // 参数businesstype：drink 为酒精测试 face 为人脸识别
    @GET("plan/tabdutyinfo/queryList")
    Observable<ResponseBody> tabdutyinfo(@Query("businesstype") String type);
    //工器具核验卡控点查询工器具接口
    @GET("plan/plan-list/detailTools/{planId}")
    Observable<ResponseBody> getDetailTools(@Path("planId") String planId);
    //工器具核验卡控点查询工器具接口
    @GET("system/reportZuoBiao/{userName}")
    Observable<ResponseBody> reportZuoBiao(@Path("userName") String userName,
                                            // 坐标经纬度（示例：12.213124,45.213213）前面为经度逗号拼接后面为纬度
                                            @Query("zuoBiao") String zuoBiao);
    //工器具核验提交接口
    @POST("plan/plan-list/updateTools")
    Observable<ResponseBody> updateTools(@Body List map);
    //卡控点拍照/录音结果数据提交接口
    @POST("plan/plan-list/updateImage")
    Observable<ResponseBody> updateImage(@Body List map);
    //记录卡控点计划列表实施
    //接口说明
    //记录卡控点计划列表实施接口，记录当前卡控点下的每一步操作的具体完成情况，支持某一个操作重复提交，只要最后完成即可
    //如果所有操作都完成，则修改卡控点完成状态并记录完成时间，
    //如果有一个操作没有完成，则无法更新卡控点完成状态，
    @POST("plan/planListImplement/recordPliAndDetail")
    Observable<ResponseBody> recordPliAndDetail(@Body Map<String,Object> map);

    //记录联控防护报警
    @POST("plan/plan-list-implement-detail/recordJointControlWarn/{executableId}/{workPointId}")
    Observable<ResponseBody> recordJointControlWarn(@Path("executableId") int executableId,
                                                    @Path("workPointId") int workPointId,
                                                    @Path("planId") int planId);
    //endregion

}
